package com.healthcloud.service;

import com.healthcloud.entity.SysUserEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.healthcloud.entity.Condition;
import com.healthcloud.utils.PageParam;

import java.util.List;

/**
 * @author Sephy
 * @since: 2015-05-10
 */
public interface UserService {

	SysUserEntity get(Long id);

    /**
     * 判断邮箱手机号是否被使用
     *
     * @param mobile 手机号
     * @return
     */
    boolean isMobileExists(String mobile);

    /**
     * 判断用户名是否被使用
     *
     * @param username 用户名
     * @return
     */
    boolean isUsernameExists(String username);

    /**
     * 根据邮箱地址查找用户
     *
     * @param email 邮箱地址
     * @return
     */
	SysUserEntity findByEmail(String email);

    /**
     * 根据手机号码查找用户
     *
     * @param mobile 手机号码
     * @return
     */
	SysUserEntity findByMobile(String mobile);

    /**
     * 根据用户名查找用户
     *
     * @param username 用户名
     * @return
     */
	SysUserEntity findByUsername(String username);

	/**
	 * 新用户注册(app端)
	 * @param mobile
     * @param username
     * @param password 用户密码  @return
     * @param userKind
     */
	SysUserEntity register(String mobile, String username, String password, Integer userKind);

    /**
     * 新用户注册(app端)
     * @param mobile
     * @param username
     * @param password
     * @param userKind
     * @param code
     * @return
     */
	SysUserEntity register(String mobile, String username, String password, Integer userKind, String code) throws Exception;

    /**
     * 新用户注册（平台端）
     * @param user
     */
	SysUserEntity register(SysUserEntity user);

    /**
	 * 用户修改用户密码
	 * @param userId 用户ID
	 * @param oldPassword 原始密码
	 * @param newPassword 新密码
	 */
	void changePassword(Long userId, String oldPassword, String newPassword) throws Exception;

    /**
	 * 用户修改用户密码
	 * @param mobile 用户手机号
	 * @param oldPassword 原始密码
	 * @param newPassword 新密码
	 */
    Boolean changePasswordByMobile(String mobile, String oldPassword, String newPassword);

    /**
	 * 用户修改用户密码
	 * @param username 用户登录帐号
	 * @param oldPassword 原始密码
	 * @param newPassword 新密码
	 */
    Boolean changePasswordByUsername(String username, String oldPassword, String newPassword);

    /**
	 * 用户修改用户密码
	 * @param email 用户邮箱
	 * @param oldPassword 原始密码
	 * @param newPassword 新密码
	 */
    Boolean changePasswordByEmail(String email, String oldPassword, String newPassword);

	/**
	 * 重置用户密码
	 * @param userId
	 * @param newPassword
	 */
	void resetPassword(Long userId, String newPassword);

	/**
	 * 通过手机号码重置用户密码
	 * @param mobile
	 * @param newPassword
	 */
	SysUserEntity resetPasswordByMobile(String mobile, String newPassword, String code) throws Exception;

	/**
	 * 激活指定用户
	 * @param userId 用户ID
	 */
	void activateUser(Long userId);

	/**
	 * 锁定指定用户
	 * @param userId
	 */
	void lockUser(Long userId);

//	Page<SysUserEntity> searchUsers(List<Condition<Object>> conditions, Pageable pageable);

    /**
     * <p>检测密码是否匹配</p>
     *
     * @param userId 用户ID
     * @param password 用户密码
     * @return
     */
    boolean checkPassword(Long userId, String password);

    /**
     * 检测用户密码是否正确, 不正确会抛出业务异常
     *
     * @param userId
     * @param password
     */
    void validatePassword(Long userId, String password);

    /**
     * <p>检测用户标志是否已经被使用, 用户标示包括 手机号码, 邮箱账号, 用户名</p>
     *
     * @param identity 用户标志
     */
    void validateIdentity(String identity);

    /**
     * 检测手机号码是否已经注册, 如果已经被注册, 会抛出业务异常
     *
     * @param mobile 要检测的手机号码
     */
    void checkMobile(String mobile);


    List<SysUserEntity> findByEntityAll(SysUserEntity entity);

    List<SysUserEntity> search(SysUserEntity entity, PageParam pageParam);

    int count(SysUserEntity entity);

    int save(SysUserEntity entity);

    int update(SysUserEntity entity);

    int delete(Long id);

    int deletes(Long[] ids);

    int logicalDelete(Long id);

    int logicalDeletes(Long[] ids);
}
